跳到主要内容

terraform in action

· 阅读需 8 分钟
南哥

Terraform是一种部署技术,适用于希望以代码(IaC)的形式提供和管理其基础设施的任何人。基础设施主要指云基础设施,尽管从技术上讲,任何可以通过应用程序编程接口(API)控制的东西都可以视为基础设施。基础设施即代码是通过机器可读的定义文件来管理和提供基础设施的过程。我们使用IaC来自动化过去需要手动完成的过程。

当我们谈论提供服务时,我们指的是部署基础设施的行为,与配置管理不同,后者主要处理应用程序的交付,特别是在虚拟机(VMs)上。像Ansible、Puppet、SaltStack和Chef这样的配置管理(CM)工具非常受欢迎,并且已经存在了很多年。Terraform并没有完全取代这些工具,因为基础设施提供和配置管理本质上是不同的问题。话虽如此,Terraform确实执行了许多过去由CM工具负责的功能,许多公司发现在采用Terraform后不再需要CM工具。

Terraform的基本原理是,它允许你编写人类可读的配置代码来定义你的IaC。通过配置代码,你可以在公有云、私有云和混合云的供应商中部署可重复、短暂且一致的环境

在本章中,我们首先讨论Terraform的显著特性。我们讨论了Terraform相对于其他IaC技术的优势和劣势,以及什么使Terraform成为明显的赢家。最后,我们通过部署一个单独的服务器到AWS并加入一些Terraform的更多动态特性,来看看Terraform的典型“Hello World!”。

最近关于Terraform的炒作很多,但这些炒作是否有理由呢?Terraform并不是唯一的IaC技术——有很多其他工具也能做同样的事情。那么Terraform,一种在高利润的软件部署市场空间中的技术,如何能与亚马逊、微软和谷歌等公司竞争呢?有六个关键特性使得Terraform独特,并赋予它竞争优势。

  • 提供工具 — 部署基础设施,而不仅仅是应用程序。
  • 易于使用 — 适合所有非天才人士。
  • 免费和开源 — 谁不喜欢免费的?
  • 声明式 — 说你想要什么,而不是怎么做。
  • 云服务无关 — 使用同一工具部署到任何云服务。
  • 富有表现力和可扩展性 — 你并不受语言的限制。

Terraform是一种基础设施提供工具,而不是配置管理(CM)工具。提供工具部署和管理基础设施,而像Ansible、Puppet、SaltStack和Chef这样的CM工具则在现有服务器上部署软件。一些CM工具也可以执行一定程度的基础设施提供,但不如Terraform,因为这并不是它们原本设计要做的任务。

CM和提供工具之间的区别是一种哲学问题。CM工具倾向于支持可变基础设施,而Terraform和其他提供工具则倾向于支持不可变基础设施。

可变基础设施意味着你在现有服务器上进行软件更新。相比之下,不可变基础设施并不关心现有的服务器——它将基础设施视为一种可丢弃的商品。这两种范例之间的区别可以概括为可重用与一次性的思维方式。

即使对于非程序员来说,Terraform的基础也是快速且容易学习的。到第4章的结束时,你将拥有成为中级Terraform用户所需的技能,当你思考这一点时,这是相当震惊的。当然,达到精通是另一回事,但这对大多数技能都是如此。

Terraform如此易用的主要原因是,代码是用一种特定领域的配置语言编写的,称为HashiCorp配置语言(HCL)。这是HashiCorp发明的一种语言,作为更冗长的配置语言(如JSON和XML)的替代品。HCL试图在人类可读性和机器可读性之间取得平衡,受到了该领域早期尝试(如libucl和Nginx配置)的影响。HCL与JSON完全兼容,这意味着HCL可以1:1地转换为JSON,反之亦然。这使得与Terraform之外的系统进行互操作或动态生成配置代码变得容易。

驱动Terraform的引擎叫做Terraform core,这是一个根据Mozilla公共许可证v2.0提供的免费和开源软件。该许可证规定任何人都可以使用、分发或修改软件,无论是用于私人还是商业目的。免费是非常好的,因为你永远不必担心在使用Terraform时产生额外的费用。另外,你可以完全了解产品及其运作方式。

并没有Terraform的高级版本,但是为了在大规模下运行Terraform,有商业和企业解决方案可用:Terraform Cloud和Terraform Enterprise。我们将在第6章中详细介绍这些内容;并且在第12章,我们将开发我们自己的Terraform Enterprise的仿制版本。

Terraform通过Terraform提供程序与不同的云进行集成。提供程序是为Terraform设计的插件,用于与外部API进行接口。每个云供应商都维护自己的Terraform提供程序,使Terraform能够管理该云中的资源。提供程序是用golang编写的,并以二进制形式在Terraform注册表(https://registry.terraform.io)上分发。它们处理所有的认证、API请求、超时和错误处理等程序逻辑。注册表上有数百个已发布的提供程序,它们共同使你能够管理数千种不同的资源。你甚至可以编写自己的Terraform提供程序,我们将在第11章中讨论。